﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using BlackoutRugby.entity.login;
using BlackoutRugby.entity.equipo;
using System.Xml;
using BlackoutRugby.entity.partido;
using BlackoutRugby.entity.liga;
using BlackoutRugby.entity.jugador;
using System.Threading;
using BlackoutRugbyWeb.BlackoutRugby.entity.equipo;
using BlackoutRugby.entity.equipo.entrenamiento;

namespace BlackoutRugby.xml.parser
{
    class XmlParser
    {
        public static LoginEntity toLoginEntity(string entrada)
        {
            return new LoginEntity();
        }

        public static InfoEquipoEntity toInfoEquipoEntity(string xmlString)
        {

            InfoEquipoEntity ieEty = new InfoEquipoEntity();
            try
            {
                XmlReader reader = XmlReader.Create(new StringReader(xmlString));

                reader.ReadToFollowing("id");
                ieEty.idEquipo = reader.ReadElementContentAsInt();

                //reader.ReadToNextSibling("name");
                ieEty.nombre = reader.ReadElementContentAsString();

                //reader.ReadToFollowing("country_iso");
                ieEty.pais = reader.ReadElementContentAsString();

                //reader.ReadToFollowing("region");
                ieEty.idRegion = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("stadium");
                ieEty.estadio = reader.ReadElementContentAsString();

                //<bot>0</bot><contentment>6</contentment>
                //reader.ReadToFollowing("drift");
                int aux = reader.ReadElementContentAsInt();

                if (aux > 0)
                    ieEty.bot = true;
                else
                    ieEty.bot = false;



                //ieEty.contentment = 
                reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("manonman");
                ieEty.members = reader.ReadElementContentAsInt();


                //reader.ReadToFollowing("bot");
                ieEty.capacidadEstadio = reader.ReadElementContentAsInt();

                ieEty.capacidadDePie = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("stadium_uncovered");
                ieEty.CapacidadDescubiertos = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("stadium_covered");
                ieEty.CapacidadCubiertos = reader.ReadElementContentAsInt();


                //reader.ReadToFollowing("stadium_members");
                ieEty.CapacidadTribuna = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("stadium_corporate");
                ieEty.CapacidadPalco = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("bank_balance");
                ieEty.balanceFinanciero = reader.ReadElementContentAsInt();



                reader.ReadElementContentAsString();
                reader.ReadElementContentAsString();
                reader.ReadElementContentAsString();

                //reader.ReadToFollowing("ranking_points");
                ieEty.puntosRanking = reader.ReadElementContentAsString();

                //reader.ReadToFollowing("regional_rank");
                ieEty.rankingRegional = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("national_rank");
                ieEty.rankingNacional = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("world_rank");
                ieEty.rankingGlobal = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("major_sponsor");
                //ieEty.patrocinadoresPpales = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("minor_sponsors");
                ieEty.patrocinadoresSecund = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("prev_ranking_points");
                ieEty.puntosRankingAnt = reader.ReadElementContentAsString();

                //reader.ReadToFollowing("prev_regional_rank");
                ieEty.rankingRegionalAnt = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("prev_national_rank");
                ieEty.rankingNacionalAnt = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("prev_world_rank");
                ieEty.rankingGlobalAnt = reader.ReadElementContentAsInt();


                //reader.ReadToFollowing("leagueid");
                ieEty.estrellasOjeador = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("plural");
                reader.ReadElementContentAsString();

                //reader.ReadToFollowing("plural1");
                reader.ReadElementContentAsString();

                //reader.ReadToFollowing("plural2");
                reader.ReadElementContentAsString();

                //reader.ReadToFollowing("plural3");
                reader.ReadElementContentAsString();

                //reader.ReadToFollowing("minimum_salary");
                reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("manager");
                ieEty.idLiga = reader.ReadElementContentAsInt();

                //reader.ReadToFollowing("manager");
                ieEty.manager = reader.ReadElementContentAsInt();

            }
            catch (Exception e)
            {
                Console.Out.WriteLine(e.ToString());
            }
            return ieEty;

        }

        public static List<PartidoEntity> toPartidoEntityBasico(string respuesta)
        {
            List<PartidoEntity> lPartidos = new List<PartidoEntity>();
            PartidoEntity pAux = null;
            XmlDocument xDoc = new XmlDocument();


            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList partidos = xDoc.GetElementsByTagName("fixture");


                foreach (XmlElement nodo in partidos)
                {
                    XmlNodeList lNodoHijo = nodo.ChildNodes;
                    pAux = new PartidoEntity();

                    foreach (XmlElement nodoHijo in lNodoHijo)
                    {
                        switch (nodoHijo.Name)
                        {
                            case "id": pAux.idPartido = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "season": pAux.temporada = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "country_iso": pAux.pais = nodoHijo.InnerText; break;
                            case "leagueid": pAux.idLiga = Convert.ToInt64(nodoHijo.InnerText); break;
                            case "round": pAux.jornada = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "hometeamid": pAux.idEquipoLocal = Convert.ToInt64(nodoHijo.InnerText); break;
                            case "guestteamid": pAux.idEquipoVisitante = Convert.ToInt64(nodoHijo.InnerText); break;
                            case "competition": pAux.competicion = nodoHijo.InnerText; break;
                            case "botmatch": pAux.partidoBot = (Convert.ToInt32(nodoHijo.InnerText) == 1) ? true : false; ; break;
                            /*case "matchstart":
                                
                                //TODO: NO FUNCIONA

                                long timestamp = Convert.ToInt64(nodoHijo.InnerText);
                                DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                                origin.AddTicks(timestamp);
                                pAux.fecha = origin; break;*/

                            ////////////////////
                        }
                    }
                    lPartidos.Add(pAux);

                }
            }
            catch (Exception e)
            { return null; };

            return lPartidos;

        }

        public static PartidoEntity completarPartido(string respuesta, PartidoEntity partido)
        {
            XmlDocument xDoc = new XmlDocument();


            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList lNodos = xDoc.GetElementsByTagName("home")[0].ChildNodes;
                foreach (XmlElement n in lNodos)
                {
                    if ("points".Equals(n.Name))
                    {
                        partido.marcadorLocal = Convert.ToInt32(n.InnerText);
                        break;
                    }

                }

                lNodos = xDoc.GetElementsByTagName("guest")[0].ChildNodes;
                foreach (XmlElement n in lNodos)
                {
                    if ("points".Equals(n.Name))
                    {
                        partido.marcadorVisitante = Convert.ToInt32(n.InnerText);
                        break;
                    }

                }

            }
            catch (Exception e)
            { return null; };

            return partido;
        }


        public static LigaEntity toLigaEntity(string respuesta)
        {

            LigaEntity liga = new LigaEntity();
            RowEntity row = null;
            XmlDocument xDoc = new XmlDocument();


            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList lNodos = xDoc.GetElementsByTagName("standing");
                foreach (XmlElement nodo in lNodos)
                {
                    XmlNodeList lNodoHijo = nodo.ChildNodes;
                    row = new RowEntity();

                    if (lNodoHijo.Count > 1)
                    {
                        foreach (XmlElement nodoHijo in lNodoHijo)
                        {
                            switch (nodoHijo.Name)
                            {
                                case "id": row.id = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "country_iso": row.pais = nodoHijo.InnerText; break;
                                case "season": row.temporada = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "division": row.division = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "league": row.idLiga = Convert.ToInt64(nodoHijo.InnerText); break;
                                case "standing": row.posicion = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "teamid": row.idEquipo = Convert.ToInt64(nodoHijo.InnerText); break;
                                case "leagueid": row.idLiga = Convert.ToInt64(nodoHijo.InnerText); break;
                                case "played": row.partidosJugados = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "w": row.partidosGanados = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "l": row.partidosPerdidos = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "d": row.partidosEmpatados = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "for": row.puntosFavor = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "against": row.puntosContra = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "b1": row.bonusOfensivo = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "b2": row.bonusDefensivo = Convert.ToInt32(nodoHijo.InnerText); break;
                                case "points": row.puntos = Convert.ToInt32(nodoHijo.InnerText); break;
                            }
                        }
                        liga.filas.Add(row);
                    }
                }
            }
            catch (Exception e)
            { return null; }

            return liga;
        }

        /*
                <standing id="1037430">
            <id>1037430</id>
            <country_iso>ES</country_iso>
            <season>16</season>
            <division>4</division>
            <league>34</league>
            <standing>1</standing>
            <teamid>82838</teamid>
            <leagueid>127192</leagueid>
            <played>4</played>
            <w>4</w>
            <l>0</l>
            <d>0</d>
            <for>418</for>
            <against>3</against>
            <b1>4</b1>
            <b2>0</b2>
            <rating_points>
            </rating_points>
            <points>20</points>
        </standing>
        <standing id="1037431">
            <id>1037431</id>
            <country_iso>ES</country_iso>
            <season>16</season>
            <division>4</division>
            <league>34</league>
            <standing>2</standing>
            <teamid>82920</teamid>
            <leagueid>127192</leagueid>
            <played>4</played>
            <w>4</w>
            <l>0</l>
            <d>0</d>
            <for>230</for>
            <against>13</against>
            <b1>3</b1>
            <b2>0</b2>
            <rating_points></rating_points>
            <points>19</points>
        </standing>*/

        public static List<entity.jugador.JugadorEntity> toListJugadoresEntity(string respuesta)
        {
            List<JugadorEntity> lJugadores = new List<JugadorEntity>();
            JugadorEntity jAux = null;
            XmlDocument xDoc = new XmlDocument();

            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList partidos = xDoc.GetElementsByTagName("player");


                foreach (XmlElement nodo in partidos)
                {
                    XmlNodeList lNodoHijo = nodo.ChildNodes;
                    jAux = new JugadorEntity();

                    foreach (XmlElement nodoHijo in lNodoHijo)
                    {
                        switch (nodoHijo.Name)
                        {
                            case "id": jAux.id = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "teamid": jAux.idEquipo = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "fname": jAux.nombre = nodoHijo.InnerText; break;
                            case "lname": jAux.apellido = nodoHijo.InnerText; break;
                            case "age": jAux.edad = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "birthday": jAux.cumpleaños = nodoHijo.InnerText; break;
                            case "hand": jAux.mano = new enums.jugador.TipoExtremidad(nodoHijo.InnerText); break;
                            case "foot": jAux.pie = new enums.jugador.TipoExtremidad(nodoHijo.InnerText); break;
                            case "nationality": jAux.nacionalidad = nodoHijo.InnerText; break;
                            case "csr": jAux.csr = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "salary": jAux.salario = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "stamina": jAux.resistencia = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "handling": jAux.manejo = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "attack": jAux.ataque = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "defense": jAux.defensa = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "technique": jAux.tecnica = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "strength": jAux.fuerza = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "jumping": jAux.salto = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "speed": jAux.velocidad = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "agility": jAux.agilidad = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "kicking": jAux.pateo = new enums.jugador.TipoHabilidad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "form": jAux.forma = new enums.jugador.TipoFLE(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "aggression": jAux.agresividad = new enums.jugador.TipoAgresividad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "discipline": jAux.disciplina = new enums.jugador.TipoDisciplina(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "energy": jAux.energia = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "leadership": jAux.liderazgo = new enums.jugador.TipoFLE(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "experience": jAux.experiencia = new enums.jugador.TipoFLE(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "weight": jAux.peso = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "height": jAux.altura = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "contract": jAux.finalizaContrado = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "joined": jAux.contratado = Convert.ToInt32(nodoHijo.InnerText); break;

                        }
                    }
                    lJugadores.Add(jAux);

                }
            }
            catch (Exception e)
            { return null; };

            return lJugadores;

        }

        internal static HistorialEntity toHistorialEntity(string respuesta)
        {
            HistorialEntity hEty = new HistorialEntity();
            HistorialRowEntity rAux = null;
            XmlDocument xDoc = new XmlDocument();

            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList partidos = xDoc.GetElementsByTagName("entry");


                foreach (XmlElement nodo in partidos)
                {
                    XmlNodeList lNodoHijo = nodo.ChildNodes;
                    rAux = new HistorialRowEntity();

                    foreach (XmlElement nodoHijo in lNodoHijo)
                    {
                        switch (nodoHijo.Name)
                        {
                            case "playerid": rAux.idJugador = Convert.ToInt64(nodoHijo.InnerText); break;
                            case "event": rAux.evento = nodoHijo.InnerText; break;
                            case "date": rAux.fecha = Convert.ToInt64(nodoHijo.InnerText); break;

                        }
                    }
                    hEty.listaRows.Add(rAux);

                }
            }
            catch (Exception e)
            { return null; };

            return hEty;
        }

        internal static List<JugadorJuvenilEntity> toListJugadoresJuvenilEntity(string respuesta)
        {

            /**
             * 
             * <player id="7000009">
             *  <id>7000009</id>
             *  <teamid>82565</teamid>
             *  <fname>Iker</fname>
             *  <lname>Priego</lname>
             *  <age>19</age>
             *  <birthday>05:4</birthday>
             *  <hand>Right</hand>
             *  <foot>Right</foot>
             *  <nationality>ES</nationality>
             *  <stamina>Unknown</stamina>
             *  <handling>Unknown</handling>
             *  <attack>Unknown</attack>
             *  <defense>Unknown</defense>
             *  <technique>Unknown</technique>
             *  <strength>Unknown</strength>
             *  <jumping>Unknown</jumping>
             *  <speed>Unknown</speed>
             *  <agility>Unknown</agility>
             *  <kicking>Unknown</kicking>
             *  <form>6</form>
             *  <aggression>3</aggression>
             *  <discipline>5</discipline>
             *  <energy>10</energy>
             *  <leadership>5</leadership>
             *  <experience>2</experience
             *  ><weight>100</weight>
             *  <height>193</height>
             *  <dualnationality>
             *  </dualnationality>
             *  <name>Iker Priego</name>
             *  <scouted>1336517147</scouted>
             *  </player>
             * */

            List<JugadorJuvenilEntity> lJugadores = new List<JugadorJuvenilEntity>();
            JugadorJuvenilEntity jAux = null;
            XmlDocument xDoc = new XmlDocument();

            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList partidos = xDoc.GetElementsByTagName("player");


                foreach (XmlElement nodo in partidos)
                {
                    XmlNodeList lNodoHijo = nodo.ChildNodes;
                    jAux = new JugadorJuvenilEntity();

                    foreach (XmlElement nodoHijo in lNodoHijo)
                    {
                        switch (nodoHijo.Name)
                        {
                            case "id": jAux.id = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "teamid": jAux.idEquipo = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "fname": jAux.nombre = nodoHijo.InnerText; break;
                            case "lname": jAux.apellido = nodoHijo.InnerText; break;
                            case "age": jAux.edad = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "birthday": jAux.cumpleaños = nodoHijo.InnerText; break;
                            case "hand": jAux.mano = new enums.jugador.TipoExtremidad(nodoHijo.InnerText); break;
                            case "foot": jAux.pie = new enums.jugador.TipoExtremidad(nodoHijo.InnerText); break;
                            case "nationality": jAux.nacionalidad = nodoHijo.InnerText; break;
                            case "stamina": jAux.resistencia = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "handling": jAux.manejo = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "attack": jAux.ataque = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "defense": jAux.defensa = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "technique": jAux.tecnica = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "strength": jAux.fuerza = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "jumping": jAux.salto = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "speed": jAux.velocidad = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "agility": jAux.agilidad = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "kicking": jAux.pateo = devolverTipoHabilidadJuvenil(nodoHijo.InnerText); break;
                            case "form": jAux.forma = new enums.jugador.TipoFLE(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "aggression": jAux.agresividad = new enums.jugador.TipoAgresividad(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "discipline": jAux.disciplina = new enums.jugador.TipoDisciplina(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "energy": jAux.energia = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "leadership": jAux.liderazgo = new enums.jugador.TipoFLE(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "experience": jAux.experiencia = new enums.jugador.TipoFLE(Convert.ToInt32(nodoHijo.InnerText)); break;
                            case "weight": jAux.peso = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "height": jAux.altura = Convert.ToInt32(nodoHijo.InnerText); break;
                            case "scouted": jAux.añadido = Convert.ToInt32(nodoHijo.InnerText); break;
                        }
                    }
                    lJugadores.Add(jAux);

                }
            }
            catch (Exception e)
            { return null; };

            return lJugadores;

        }

        private static enums.jugador.TipoHabilidadJuvenil devolverTipoHabilidadJuvenil(string p)
        {
            switch (p)
            {
                case "Unknown": return new enums.jugador.TipoHabilidadJuvenil(BlackoutRugby.enums.jugador.TipoHabilidadJuvenil.TipoDesconocido.Desconocido);
                case "Low": return new enums.jugador.TipoHabilidadJuvenil(BlackoutRugby.enums.jugador.TipoHabilidadJuvenil.TipoDesconocido.Bajo);
                case "Medium": return new enums.jugador.TipoHabilidadJuvenil(BlackoutRugby.enums.jugador.TipoHabilidadJuvenil.TipoDesconocido.Medio);
                case "High": return new enums.jugador.TipoHabilidadJuvenil(BlackoutRugby.enums.jugador.TipoHabilidadJuvenil.TipoDesconocido.Alto);
                default: return new enums.jugador.TipoHabilidadJuvenil(Convert.ToInt32(p));
            }
        }

        internal static InfoPartidoEntity toInfoPartidoEntity(string respuesta, bool esJuvenil, long idEquipo)
        {

            InfoPartidoEntity info = new InfoPartidoEntity();
            info.juvenil = esJuvenil;

            List<InfoJugadorEntity> lJugadores = new List<InfoJugadorEntity>();
            XmlDocument xDoc = new XmlDocument();
            
            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList elemsLocal = xDoc.GetElementsByTagName("home_team_stats"); 
                string id = elemsLocal.Item(0).Attributes["id"].Value;

                if (idEquipo == Convert.ToInt32(id))
                {
                    foreach (XmlElement nodo in elemsLocal)
                    {
                        XmlNodeList lNodoHijo = nodo.ChildNodes;
                        foreach (XmlElement nodoHijo in lNodoHijo)
                        {
                            parsearElementAInfo(info, nodoHijo);
                        }
                    }

                    //falta`parseo jugadores

                    for (int i = 1; i < 23; i++)
                    {
                        XmlNodeList lList = xDoc.GetElementsByTagName("home_player_" + i);
                        InfoJugadorEntity jAux = new InfoJugadorEntity();
                                
                        foreach (XmlElement nodo in lList)
                        {
                            XmlNodeList lNodoHijo = nodo.ChildNodes;
                            foreach (XmlElement nodoHijo in lNodoHijo)
                            {
                                parsearElementAInfoJugador(jAux, nodoHijo);
                               
                            }

                        }
                        lJugadores.Add(jAux);
                        Thread.Sleep(5000);
                    }
                    info.infoJugadores = lJugadores;
                }
                else
                {
                    XmlNodeList elemsVisitante = xDoc.GetElementsByTagName("guest_team_stats");
                    foreach (XmlElement nodo in elemsVisitante)
                    {
                        XmlNodeList lNodoHijo = nodo.ChildNodes;
                        foreach (XmlElement nodoHijo in lNodoHijo)
                        {
                            parsearElementAInfo(info, nodoHijo);
                        }
                    }

                    for (int i = 1; i < 23; i++)
                    {
                        XmlNodeList lList = xDoc.GetElementsByTagName("guest_player_" + i);
                        InfoJugadorEntity jAux = new InfoJugadorEntity();
                        foreach (XmlElement nodo in lList)
                        {
                            XmlNodeList lNodoHijo = nodo.ChildNodes;
                            foreach (XmlElement nodoHijo in lNodoHijo)
                            {
                                parsearElementAInfoJugador(jAux, nodoHijo);
                                
                            }
                            
                        }
                        lJugadores.Add(jAux);
                    }
                    info.infoJugadores = lJugadores;
                }
            }
            catch (Exception e)
            {
                return null;
            }

            return info;
        }

        private static void parsearElementAInfoJugador(InfoJugadorEntity jAux, XmlElement nodo)
        {
            /***
             * 
             * <id>11600039</id>
			<tackles>3</tackles>
			<metres_gained>19</metres_gained>
			<tries>0</tries>
			<conversions>0</conversions>
			<missed_conversions>0</missed_conversions>
			<dropgoals>0</dropgoals>
			<missed_dropgoals>0</missed_dropgoals>
			<penalties>0</penalties>
			<missed_penalties>0</missed_penalties>
			<total_points>0</total_points>
			<yellow_cards>0</yellow_cards>
			<red_cards>0</red_cards>
			<linebreaks>0</linebreaks>
			<intercepts>1</intercepts>
			<kicks>0</kicks>
			<good_kicks>0</good_kicks>
			<bad_kicks>0</bad_kicks>
			<up_and_unders>0</up_and_unders>
			<good_up_and_unders>0</good_up_and_unders>
			<bad_up_and_unders>0</bad_up_and_unders>
			<knockons>0</knockons>
			<forward_passes>1</forward_passes>
			<try_assists>0</try_assists>
			<>0</beaten_defenders>
			<>0</injuries>
			<>1</handling_errors>
			<>5</missed_tackles>
			<>0</fights>
			<>0</kicking_metres>
			<>1</league_caps>
			<friendly_caps>0</friendly_caps>
			<cup_caps>0</cup_caps>
			<under_twenty_caps>0</under_twenty_caps>
			<national_caps>0</national_caps>
			<under_twenty_world_cup_caps>0</under_twenty_world_cup_caps>
			<world_cup_caps>0</world_cup_caps>
			<other_caps>0</other_caps>
			<>2</penalties_conceded>
			<>0</kicks_out_on_the_full>
			<>8</ball_time>
			<>6</penalty_time>
			<>0</played>
			<>0</turnovers>
			<>1</lineouts_secured>
			<>0</lineouts_conceded>
			<>0</lineouts_stolen>
			<>0</successful_lineout_throws>
			<>0</unsuccessful_lineout_throws>
			<>80</minutes_played>
			<>11</energy_before>
			<>9</energy_after>
             * */

            switch (nodo.Name)
            {

                case "tackles": jAux.placajes = Convert.ToInt32(nodo.InnerText); break;
                case "metres_gained": jAux.metrosGanados = Convert.ToInt32(nodo.InnerText); break;
                case "tries": jAux.ensayos = Convert.ToInt32(nodo.InnerText); break;
                case "conversions": jAux.conversiones = Convert.ToInt32(nodo.InnerText); break;
                case "missed_conversions": jAux.conversionesFalladas = Convert.ToInt32(nodo.InnerText); break;
                case "dropgoals": jAux.drops = Convert.ToInt32(nodo.InnerText); break;
                case "missed_dropgoals": jAux.dropsFallados = Convert.ToInt32(nodo.InnerText); break;
                case "penalties": jAux.golpesMarcados = Convert.ToInt32(nodo.InnerText); break;
                case "missed_penalties": jAux.golpesFallados = Convert.ToInt32(nodo.InnerText); break;
                case "total_points": jAux.puntosTotales = Convert.ToInt32(nodo.InnerText); break;
                case "yellow_cards": jAux.amarillas = Convert.ToInt32(nodo.InnerText); break;
                case "red_cards": jAux.rojas = Convert.ToInt32(nodo.InnerText); break;
                case "linebreaks": jAux.rupturasLinea = Convert.ToInt32(nodo.InnerText); break;
                case "intercepts": jAux.intercepciones = Convert.ToInt32(nodo.InnerText); break;
                case "kicks": jAux.patadas = Convert.ToInt32(nodo.InnerText); break;
                case "good_kicks": jAux.patadasBuenas = Convert.ToInt32(nodo.InnerText); break;
                case "bad_kicks": jAux.patadasMalas = Convert.ToInt32(nodo.InnerText); break;
                case "up_and_unders": jAux.upAndUnder = Convert.ToInt32(nodo.InnerText); break;
                case "good_up_and_unders": jAux.upAndUnderBuenos = Convert.ToInt32(nodo.InnerText); break;
                case "bad_up_and_unders": jAux.upAndUnderMalos = Convert.ToInt32(nodo.InnerText); break;
                case "knockons": jAux.avants = Convert.ToInt32(nodo.InnerText); break;
                case "try_assists": jAux.asistenciasEnsayo = Convert.ToInt32(nodo.InnerText); break;
                case "forward_passes": jAux.pasesAdelantados = Convert.ToInt32(nodo.InnerText); break;
                case "beaten_defenders": jAux.defensoresVencidos = Convert.ToInt32(nodo.InnerText); break;
                case "injuries": jAux.lesiones = Convert.ToInt32(nodo.InnerText); break;
                case "handling_errors": jAux.erroresManejo = Convert.ToInt32(nodo.InnerText); break;
                case "missed_tackles": jAux.placajesFallados = Convert.ToInt32(nodo.InnerText); break;
                case "fights": jAux.peleas = Convert.ToInt32(nodo.InnerText); break;
                case "kicking_metres": jAux.metrosPateados = Convert.ToInt32(nodo.InnerText); break;
                case "penalties_conceded": jAux.golpesCometidos = Convert.ToInt32(nodo.InnerText); break;
                case "kicks_out_on_the_full": jAux.patadasEnviadasFuera = Convert.ToInt32(nodo.InnerText); break;
                case "ball_time": jAux.tiempoDeBola = Convert.ToInt32(nodo.InnerText); break;
                case "penalty_time": jAux.TiempoGolpe = Convert.ToInt32(nodo.InnerText); break;
                case "played": jAux.jugado = Convert.ToInt32(nodo.InnerText); break;
                case "turnovers": jAux.robosDeBalon = Convert.ToInt32(nodo.InnerText); break;
                case "lineouts_secured": jAux.touchAseguradas = Convert.ToInt32(nodo.InnerText); break;
                case "lineouts_conceded": jAux.touchFalladas = Convert.ToInt32(nodo.InnerText); break;
                case "lineouts_stolen": jAux.touchRobadas = Convert.ToInt32(nodo.InnerText); break;
                case "successful_lineout_throws": jAux.lanzamientosTouchAcertados = Convert.ToInt32(nodo.InnerText); break;
                case "unsuccessful_lineout_throws": jAux.lanzamientosTouchFallados = Convert.ToInt32(nodo.InnerText); break;
                case "minutes_played": jAux.minutosJugados = Convert.ToInt32(nodo.InnerText); break;
                case "energy_before": jAux.energiaAntes = Convert.ToInt32(nodo.InnerText); break;
                case "energy_after": jAux.energiaDespues = Convert.ToInt32(nodo.InnerText); break;

            }
        }



        private static void parsearElementAInfo(InfoPartidoEntity info, XmlElement nodo)
        {
            
            
            /*
             * 
             * 
             * 
        <tackles>44</tackles>
		<metres_gained>74</metres_gained>
		<tries>1</tries>
		<conversions>0</conversions>
		<missed_conversions>1</missed_conversions>
		<dropgoals>0</dropgoals>
		<missed_dropgoals>0</missed_dropgoals>
		<penalties>0</penalties>
		<missed_penalties>0</missed_penalties>
		<total_points>5</total_points>
		<yellow_cards>0</yellow_cards>
		<red_cards>0</red_cards>
		<linebreaks>0</linebreaks>
		<intercepts>1</intercepts>
		<kicks>7</kicks>
		<good_kicks>6</good_kicks>
		<bad_kicks>1</bad_kicks>
		<up_and_unders>1</up_and_unders>
		<good_up_and_unders>0</good_up_and_unders>
		<bad_up_and_unders>1</bad_up_and_unders>
		<knockons>3</knockons>
		<forward_passes>3</forward_passes>
		<phases>18</phases>
		<sevenplus_phases>0</sevenplus_phases>
		<turnovers>6</turnovers>
		<possession>1277</possession>
		<territory>1126</territory>
		<minutes_in_22>297</minutes_in_22>
		<lineouts_won>2</lineouts_won>
		<lineouts_lost>15</lineouts_lost>
		<lineouts_against_throw>0</lineouts_against_throw>
		<lineouts_thrown>7</lineouts_thrown>
		<lineouts_secured>2</lineouts_secured>
		<scrums_won>4</scrums_won>
		<scrums_lost>16</scrums_lost>
		<scrums_against_put_in>0</scrums_against_put_in>
		<scrums_put_in>14</scrums_put_in>
		<scrums_secured>4</scrums_secured>
		<injuries>0</injuries>
		<category_1_injuries>0</category_1_injuries>
		<category_2_injuries>0</category_2_injuries>
		<category_3_injuries>0</category_3_injuries>
		<category_4_injuries>0</category_4_injuries>
		<category_5_injuries>0</category_5_injuries>
		<category_6_injuries>0</category_6_injuries>
		<injury_breaks>3</injury_breaks>
		<handling_errors>5</handling_errors>
		<missed_tackles>31</missed_tackles>
		<fights>0</fights>
		<kicking_metres>158</kicking_metres>
		<rucks_won>18</rucks_won>
		<mauls_won>0</mauls_won>
		<matches_played>1</matches_played>
		<penalties_conceded>15</penalties_conceded>
		<penalties_won>4</penalties_won>
		<kicks_out_on_the_full>0</kicks_out_on_the_full>
		<ball_time>100</ball_time>
		<penalty_time>82</penalty_time>
		<turnovers_conceded>3</turnovers_conceded>
             * 
             * */
            switch (nodo.Name )
            {

                case "tackles": info.placajes = Convert.ToInt32(nodo.InnerText); break;
                case "metres_gained": info.metrosGanados = Convert.ToInt32(nodo.InnerText); break;
                case "tries": info.ensayos = Convert.ToInt32(nodo.InnerText); break;
                case "conversions": info.conversiones = Convert.ToInt32(nodo.InnerText); break;
                case "missed_conversions": info.conversionesFalladas = Convert.ToInt32(nodo.InnerText); break;
                case "dropgoals": info.drops = Convert.ToInt32(nodo.InnerText); break;
                case "missed_dropgoals": info.dropsFallados = Convert.ToInt32(nodo.InnerText); break;
                case "penalties": info.golpesMarcados = Convert.ToInt32(nodo.InnerText); break;
                case "missed_penalties": info.golpesFallados = Convert.ToInt32(nodo.InnerText); break;
                case "total_points":info.puntosTotales = Convert.ToInt32(nodo.InnerText);break;
                case "yellow_cards":info.amarillas = Convert.ToInt32(nodo.InnerText);break;
                case "red_cards":info.rojas = Convert.ToInt32(nodo.InnerText);break;
                case "linebreaks":info.rupturasLinea = Convert.ToInt32(nodo.InnerText);break;
                case "intercepts":info.intercepciones = Convert.ToInt32(nodo.InnerText);break;
                case "kicks":info.patadas = Convert.ToInt32(nodo.InnerText);break;
                case "good_kicks":info.patadasBuenas = Convert.ToInt32(nodo.InnerText);break;
                case "bad_kicks":info.patadasMalas = Convert.ToInt32(nodo.InnerText);break;
                case "up_and_unders":info.upAndUnder = Convert.ToInt32(nodo.InnerText);break;
                case "good_up_and_unders":info.upAndUnderBuenos = Convert.ToInt32(nodo.InnerText);break;
                case "bad_up_and_unders":info.upAndUnderMalos = Convert.ToInt32(nodo.InnerText);break;
                case "knockons":info.avants = Convert.ToInt32(nodo.InnerText);break;
                case "forward_passes":info.pasesAdalentados = Convert.ToInt32(nodo.InnerText);break;
                case "phases":info.fases = Convert.ToInt32(nodo.InnerText);break;
                case "sevenplus_phases":info.sieteomasfases = Convert.ToInt32(nodo.InnerText);break;
                case "turnovers":info.balonesRobados = Convert.ToInt32(nodo.InnerText);break;
                case "possession":info.posesion = Convert.ToInt32(nodo.InnerText);break;
                case "territory":info.territorio = Convert.ToInt32(nodo.InnerText);break;
                case "minutes_in_22":info.minutosEn22 = Convert.ToInt32(nodo.InnerText);break;
                case "lineouts_won":info.touchGanadas = Convert.ToInt32(nodo.InnerText);break;
                case "lineouts_lost":info.touchPerdidas = Convert.ToInt32(nodo.InnerText);break;
                case "lineouts_against_throw":info.touchRobadas = Convert.ToInt32(nodo.InnerText);break;
                case "lineouts_secured":info.touchAseguradas = Convert.ToInt32(nodo.InnerText);break;
                case "scrums_won":info.melesGanadas = Convert.ToInt32(nodo.InnerText);break;
                case "scrums_lost":info.melesPerdidas = Convert.ToInt32(nodo.InnerText);break;
                case "scrums_against_put_in":info.melesRobadas = Convert.ToInt32(nodo.InnerText);break;
                case "scrums_put_in":info.melesGiradas = Convert.ToInt32(nodo.InnerText);break;
                case "scrums_secured":info.melesAseguradas = Convert.ToInt32(nodo.InnerText);break;
                case "injuries":info.lesiones = Convert.ToInt32(nodo.InnerText);break;
                case "category_1_injuries":info.lesionesGrado1 = Convert.ToInt32(nodo.InnerText);break;
                case "category_2_injuries":info.lesionesGrado2 = Convert.ToInt32(nodo.InnerText);break;
                case "category_3_injuries":info.lesionesGrado3 = Convert.ToInt32(nodo.InnerText);break;
                case "category_4_injuries":info.lesionesGrado4 = Convert.ToInt32(nodo.InnerText);break;
                case "category_5_injuries":info.lesionesGrado5 = Convert.ToInt32(nodo.InnerText);break;
                case "category_6_injuries":info.lesionesGrado6 = Convert.ToInt32(nodo.InnerText);break;
                case "injury_breaks":info.lesionesEvitadas = Convert.ToInt32(nodo.InnerText);break;
                case "handling_errors":info.erroresDeManejo = Convert.ToInt32(nodo.InnerText);break;
                case "missed_tackles":info.placajesFallados = Convert.ToInt32(nodo.InnerText);break;
                case "fights":info.peleas = Convert.ToInt32(nodo.InnerText);break;
                case "kicking_metres":info.metrosPateados = Convert.ToInt32(nodo.InnerText);break;
                case "rucks_won":info.ruckGanados = Convert.ToInt32(nodo.InnerText);break;
                case "mauls_won":info.ruckPerdidos = Convert.ToInt32(nodo.InnerText);break;
                case "penalties_conceded":info.golpesConcedidos = Convert.ToInt32(nodo.InnerText);break;
                case "penalties_won":info.golpesRecibidos = Convert.ToInt32(nodo.InnerText);break;
                case "kicks_out_on_the_full":info.patadasEnviadasFuera = Convert.ToInt32(nodo.InnerText);break;
                case "ball_time":info.tiempoDeBola = Convert.ToInt32(nodo.InnerText);break;
                case "penalty_time":info.tiempoGolpe = Convert.ToInt32(nodo.InnerText);break;
                case "turnovers_conceded":info.perdidasDeBalon = Convert.ToInt32(nodo.InnerText);break;
                
            }
        }

        internal static BlackoutRugbyWeb.BlackoutRugby.entity.equipo.InfoEntrenamientoEntity toInfoEntrenamientoEntity(string respuesta)
        {
            InfoEntrenamientoEntity ety = new InfoEntrenamientoEntity();
            XmlDocument xDoc = new XmlDocument();


            try
            {
                xDoc.LoadXml(respuesta);
                XmlNodeList partidos = xDoc.GetElementsByTagName("team_training");
                foreach (XmlElement nodo in partidos)
                {
                    XmlNodeList lNodoHijo = nodo.ChildNodes;
                    foreach (XmlElement nodoHijo in lNodoHijo)
                    {
                        switch (nodoHijo.Name)
                        {
                            case "skills": parsearEntremaminetoEquipo(nodoHijo, ety); break;
                            case "players": parsearJugadoresEntrenamiento(nodoHijo, ety); break;
                        }
                    }
                }

            }
            catch (Exception e)
            {
                return null;
            }

            return ety;
        }

        private static void parsearJugadoresEntrenamiento(XmlElement nodoHijo, InfoEntrenamientoEntity ety)
        {
            XmlNodeList skills = nodo.ChildNodes;

            foreach (XmlElement skill in skills)
            {
                ety.añadirHabilidad(skill.Value);
            }
        }

        private static void parsearEntremaminetoEquipo(XmlElement nodo, InfoEntrenamientoEntity ety)
        {
            XmlNodeList jugadores = nodo.ChildNodes;

            foreach (XmlElement jugador in jugadores)
            {
                InfoEntrenamientoJugador j = new InfoEntrenamientoJugador();

                switch (jugador.Name)
                {
                        /*
                         * 
                         * <id>2384003</id>
				<drops>
					<skill>handling</skill>
					<skill>jumping</skill>
					</drops>
				<pops>
				</pops>
				<csr>
					<old>21620</old>
					<new>20489</new>
				</csr>*/
                    case "id": j.id = Convert.ToInt32(jugador.Value); break;

                    case "drops":
                        foreach (XmlElement hab in jugador.SelectNodes("drops"))
                            j.habilidadesBajan.Add(hab.Value);
                        break;

                   case "pops":
                        foreach (XmlElement hab in jugador.SelectNodes("pops"))
                            j.habilidadesSuben.Add(hab.Value);
                        break;


                            
                }
            }
        }

    }
}